\section{JavaScript核心语法}

\subsection{注释}

JavaScript的注释和css注释类似，分多行和单行，多行注释使用/* ... */，如：

\begin{lstlisting}
/*
Everything in between is a comment.
*/
\end{lstlisting}

单行注释使用“//”表示，如：

\begin{lstlisting}
// This is a comment
\end{lstlisting}

\subsection{变量}

所谓变量就是程序中数据的临时存放场所。JavaScript的变量定义都是使用“var”关键字，示例如下：

\begin{lstlisting}
var author = "yangjh";
var age = 35;
var Age = 36;
var male = true;
\end{lstlisting}

上述三行代码中，var关键字表示声明变量，变量名紧跟其后，通过等于号将变量赋予变量初始值。每一行结束的分号可以不写，但书写分号后，能增强代码的可读性。

变量的名称必须遵循以下规则：

\begin{enumerate}
  \item 首字符必须是字母、下划线或美元符号。
  \item 其余字母可以是下划线、美元符号、任意字母或者数字。
  \item 变量名称不能是关键字或保留字,具体保留字的内容参见附录\ref{JavaScript保留字}。
  \item 变量名对大小写敏感，例如：变量age和Age是不同的变量。
  \item 变量名中不能有空格、回车符或其他标点字符。
\end{enumerate}

\subsection{常量}

常量意味着其中保存的值是固定不变的，JavaScript使用关键字const声明常量，习惯上，常量名称使用大写字母。

\begin{lstlisting}
const A = 7;
console.log("A is " + A + ".");
\end{lstlisting}

上面的例子将输出 "A is 7."。

\subsection{运算符}

运算符用于将一个或多个值运算成结果。在Javascript中，常用的运算符有以下几种类别：

\subsubsection{算术运算符}

算术运算符能对操作数进行运算，返回一个数值型的值。常见的有“+”、“-”、 “*”、“/”。

\subsubsection{关系运算符}

关系运算符（见\ref{tab:关系运算符}）通常用于检查两个操作数之间的关系，返回值为true或false。

\begin{table}[htbp]
\centering
\caption{关系运算符}
\begin{tabular}{llll}
  \toprule
  运算符 & 说明 & 例子 & 结果\\
  \midrule
  ==      & 是否相等    & 5=="5"  & TRUE \\
  ===     & 是否全等    & 5=="5"  & FALSE \\
  ！=     & 是否不等    & 5！="5"  & FALSE \\
  !==     & 是否不全等   & 5！="5"  & TRUE \\
  >       & 是否大于    & 5>8     & FALSE \\
  <       & 是否小于    & 5<8     & TRUE \\
  >=      & 是否大于等于  & 5>=8    & FALSE \\
  <=      & 是否小于等于  & 5<=8    & TRUE \\
  \bottomrule
\end{tabular}
\label{tab:关系运算符}
\end{table}

\subsubsection{赋值运算符}

赋值运算符是使用最多的运算符，常见的赋值运算符就是“=”，它将右边的值赋与等号左边的变量。

\subsubsection{逻辑运算符}
逻辑运算符用来判断操作数之间的逻辑关系，返回值为true和false。javascript支持一下三种逻辑运算符（见\ref{tab:逻辑运算符}）。

\begin{table}[htbp]
  \centering
  \caption{逻辑运算符}
    \begin{tabular}{llll}
    \toprule
    \multicolumn{1}{c}{运算符} & \multicolumn{1}{c}{说明} & \multicolumn{1}{c}{例子} & \multicolumn{1}{c}{结果} \\
    \midrule
    \&\&    & 逻辑与     & 5>3 \&\& 4>3 & TRUE \\
    ||      & 逻辑或     & 5>3 || 3>5 & FALSE \\
    !       & 逻辑非    & !(3>5)  & TRUE \\
    \bottomrule
    \end{tabular}%
  \label{tab:逻辑运算符}%
\end{table}%

\subsubsection{连接运算符}

连接运算符“+”能将字符串连接起来构成一个新的字符串。如：

\begin{lstlisting}
var txt1 = “JavaScript”；
var txt2 = “基础教程”;
var txt3 = txt1 + txt2;
\end{lstlisting}

变量txt3的结果是“JavaScript基础教程”。

\subsection{流程控制}

和其他语言一样，JavaScript也是由上到下逐行执行代码，还可以通过分支、循环改变执行流程。

\subsubsection{语句块}

语句块用来组织多条语句。用一对花括号界定语句块。语法如下：

\begin{lstlisting}
{
  statement_1;
  statement_2;
  ...
  statement_n;
}
\end{lstlisting}

注意语句块不是以分号结尾。语句块常在流程控制语句中使用。

\subsubsection{if...else}

根据设定条件，选择性地执行语句，当指定条件为true时会执行一条语句，如果该条件为false，则执行另一条语句。
\begin{lstlisting}
if (condition) {
   statements1
} else {
   statements2
}
\end{lstlisting}

\subsubsection{switch}

switch语句对一个表达式求值，将结果与 case 子语句比较，如果匹配，则从 case 处的语句向下执行。

\begin{lstlisting}
switch (expression) {
  case value1:
    // 当 expression 的结果与 value1 匹配时，从此处开始执行
    statements1；
    [break;]
  case value2:
    // 当 expression 的结果与 value2 匹配时，从此处开始执行
    statements2;
    [break;]
  ...
  case valueN:
    // 当 expression 的结果与 valueN 匹配时，从此处开始执行
    statementsN;
    [break;]
  default:
    // 如果 expression 与上面的 value 值都不匹配时，执行此处的语句
    statements_def;
    [break;]
}
\end{lstlisting}

switch语句中的break语句，能保证程序执行到该语句时，不再执行后续语句，而是跳出switch语句块。

\subsubsection{for}

for语句创建一个包含初始条件、终止条件和步进规则的循环体。例如下面的代码将循环10次（从0-9），然后在控制台中打印出0-9的数字：
\begin{lstlisting}
for (var i = 0; i < 9; i++) {
   console.log(i);
   // more statements
}
\end{lstlisting}

\subsubsection{while}

while 语句可以在某个条件表达式为真的前提下，循环执行指定的一段代码，直到那个表达式不为真时结束循环。语法如下：

\begin{lstlisting}
while (condition) {
  statement
}
\end{lstlisting}

\subsubsection{do...while}

do...while 语句创建了一个循环，该循环执行一个指定的语句直到condition 的值为 false。 condition 在执行statement后才会被赋值，statement至少执行一次。语法如下：

\begin{lstlisting}
do {
   statement;
   ...
 }
while (condition);
\end{lstlisting}

\subsection{函数}
使用关键字function声明一个函数。函数还可有参数和返回值。

\begin{lstlisting}
function name([param,[, param,[..., param]]]) {
   [statements]
}
\end{lstlisting}

默认情况下，函数是返回 undefined 类型。想要返回一个其他的值，函数必须通过一个 return 语句指定返回值。

\subsection{对象}

Javascript 中对象(object)的概念可以比照着现实生活中实实在在的物体来理解。

在JavaScript中，一个对象可以是一个单独的拥有属性和类型的实体。我们拿它和一个杯子做下类比。一个杯子是一个对象(物体)，拥有属性。杯子有颜色，图案，重量，由什么材质构成等等。同样，javascript对象也有属性来定义它的特征。

一个对象就是一系列属性的集合，一个属性包含一个名字和一个值。一个属性的值可以是函数，这种情况下属性也被称为方法。

在 JavaScript 中，几乎所有的东西都是对象。所有的原生类型除了 null 与 undefined 之外都被当作对象。它们可以被赋予属性，并且它们都有对象的全部特征。

\subsubsection{对象的创建}

JavaScript 拥有一系列预定义的对象。另外，我们可以通过对象初始化器（Object Initializer）创建自己的对象。或者通过创建一个构造函数并使用该函数和 new 操作符初始化对象。

通过对象初始化器创建对象的方法如下：

\begin{lstlisting}
var obj = { property_1:   value_1,   // property_# may be an identifier...
            property_2:   value_2,   // or a number...
            // ...,
            "property n": value_n }; // or a string
\end{lstlisting}

这里 obj 是新对象实例的名称，每一个 property\_i 是一个标识符（可以是一个名称、数字或字符串字面量），并且每个 value\_i 是一个其值将被赋予 property\_i 的表达式。属性的集合用{}标记，通过点符号来访问一个对象的属性。对象有时也被叫作关联数组, 因为每个属性都有一个用于访问它的字符串值。如：

\begin{lstlisting}
obj['property_1'] = value1;
obj[0] = value1;
\end{lstlisting}

但显然，用方括号访问对象属性的方式不如使用点符号的方式简洁。

通过new运算符创建对象的示例如下：

\begin{lstlisting}
var author = new Object();
author.words = '绿叶恋爱时便成了花';
console.log(author.words);
\end{lstlisting}

new运算符的作用是创建一个对象实例。单纯的使用new运算符创建对象实例的方式不够灵活，尤其是要创建对象的多个实例时，需要逐一完成对象属性的赋值工作。因此，常通过构造函数和new运算符的结合创造对象，这种对象创造方法能在创造对象的同时完成对象属性的赋值。

构造函数，是一种特殊的方法。主要用来在创建对象时初始化对象， 即为对象成员变量赋初始值，与new运算符一起使用在创建对象的语句中。

通过构造函数和new运算符创建对象的例子：

\begin{lstlisting}
function student(sName, sex, major) {
        this.sName = sName;
        this.sex   = sex;
        this.major = major;
    }
var student1 = new student('小明', '男','新媒体');
\end{lstlisting}

其中的this关键字指代对象本身。

\subsubsection{对象属性的枚举}

在有些情况下，开发人员并不了解对象的内部属性，这时可以使用for…in语句枚举对象的所有属性。如下例所示：

\begin{lstlisting}
for(var i in student1) {
  console.log(i + "=" + student1[i]);
}
\end{lstlisting}
